import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['DengXian Bold', 'Microsoft YaHei UI Bold', 'SimHei']
plt.rcParams['axes.unicode_minus'] = False

print("=" * 50)
print("任务一：pandas数据分析——公司人事财务数据分析")
print("=" * 50)

# 1. 导入数据并显示基本信息
data = pd.read_excel('data.xlsx', header=1)  # 第二行作为列名
print(f"数据行数：{len(data)}")
print("\n前10行数据：")
print(data.head(10))
print("\n后15行数据：")
print(data.tail(15))

# 2. 处理缺失值和重复值
print("\n2. 处理缺失值和重复值")
print(f"处理前缺失值数量：{data.isnull().sum().sum()}")
print(f"处理前重复数据数量：{data.duplicated().sum()}")

data_clean = data.fillna("无")
data_clean = data_clean.drop_duplicates()

print(f"处理后缺失值数量：{data_clean.isnull().sum().sum()}")
print(f"处理后数据行数：{len(data_clean)}")

# 3. 查询在职员工人数和工资统计
print("\n3. 查询统计信息")
在职员工数 = len(data_clean[data_clean['在职状态'] == '在职'])
print(f"在职员工人数：{在职员工数}")

工资数据 = data_clean[data_clean['应发工资'].notna() & (data_clean['应发工资'] != "无")]
if not 工资数据.empty:
    工资数值 = pd.to_numeric(工资数据['应发工资'].astype(str).str.replace(',', ''), errors='coerce')
    工资数值 = 工资数值.dropna()
    print(f"应发工资最大值：{工资数值.max()}")
    print(f"应发工资最小值：{工资数值.min()}")

# 4. 增加新数据
print("\n4. 增加新员工数据")
新员工 = {
    '序号': 993,
    '工号': 'GH993',
    '姓名': '张三',
    '性别': '男',
    '手机号': '13888888888',
    '出生年月': '19900201',
    '入职日期': '20240101',
    '年龄': 34,
    '在职状态': '在职',
    '工龄': 1,
    '籍贯': '北京市',
    '学历': '本科',
    '基本工资': 6000,
    '应发工资': 8000
}

data_clean = pd.concat([data_clean, pd.DataFrame([新员工])], ignore_index=True)
print("已添加新员工数据")

# 5. 修改员工信息
print("\n5. 修改员工信息")
if 990 in data_clean['序号'].values:
    data_clean.loc[data_clean['序号'] == 990, '手机号'] = '15012345678'
    print("已更新序号为990的员工手机号")
else:
    print("未找到序号为990的员工")

# 6. 删除特定条件的员工
print("\n6. 删除员工信息")
删除前行数 = len(data_clean)
删除条件 = (data_clean['年龄'] > 55) & (data_clean['在职状态'] == '离职') & (data_clean['性别'] == '男')
data_clean = data_clean[~删除条件]
删除后行数 = len(data_clean)
print(f"删除了{删除前行数 - 删除后行数}条记录")

# 7. 分组分析
print("\n7. 分组分析")
try:
    有效工资数据 = data_clean[data_clean['应发工资'].notna() & (data_clean['应发工资'] != "无")]
    有效工资数据['应发工资_数值'] = pd.to_numeric(有效工资数据['应发工资'].astype(str).str.replace(',', ''), errors='coerce')
    
    学历工资分析 = 有效工资数据.groupby('学历')['应发工资_数值'].mean()
    性别工资分析 = 有效工资数据.groupby('性别')['应发工资_数值'].mean()
    
    print("不同学历员工平均应发工资：")
    print(学历工资分析)
    print("\n不同性别员工平均应发工资：")
    print(性别工资分析)
except Exception as e:
    print(f"分组分析出现错误：{e}")

# 8. 导出数据
print("\n8. 导出数据")
data_clean.to_excel('dataoutput.xlsx', index=False)
print("数据已导出到dataoutput.xlsx")

print("\n" + "=" * 50)
print("任务二：Python可视化分析——人口数据可视化展示")
print("=" * 50)

# 导入人口数据
population = pd.read_excel('population.xlsx')
print("人口数据加载完成")

# 1. 绘制2014-2022年城乡人口数据变化柱状图
fig, ax = plt.subplots(figsize=(12, 6))
years = population['年份'].str.replace('年', '')
width = 0.35
x = np.arange(len(years))

ax.bar(x - width/2, population['城镇人口'], width, label='城镇人口', color='skyblue')
ax.bar(x + width/2, population['乡村人口'], width, label='乡村人口', color='lightcoral')

ax.set_xlabel('年份')
ax.set_ylabel('人口数量（万人）')
ax.set_title('2014-2022年城乡人口数据变化')
ax.set_xticks(x)
ax.set_xticklabels(years, rotation=45)
ax.legend()
plt.tight_layout()
plt.savefig('城乡人口变化柱状图.png', dpi=300, bbox_inches='tight')
plt.show()

# 2. 绘制2022年男女人口比例情况饼图
data_2022 = population[population['年份'] == '2022年']
if not data_2022.empty:
    male_pop = data_2022['男性人口'].iloc[0]
    female_pop = data_2022['女性人口'].iloc[0]
    
    plt.figure(figsize=(8, 8))
    labels = ['男性', '女性']
    sizes = [male_pop, female_pop]
    colors = ['lightblue', 'pink']
    
    plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%', startangle=90)
    plt.title('2022年男女人口比例')
    plt.axis('equal')
    plt.savefig('2022年男女人口比例饼图.png', dpi=300, bbox_inches='tight')
    plt.show()

# 3. 绘制城镇和乡村人口变化趋势折线图
plt.figure(figsize=(10, 6))
years_num = [int(year.replace('年', '')) for year in population['年份']]
plt.plot(years_num, population['城镇人口'], marker='o', label='城镇人口', linewidth=2)
plt.plot(years_num, population['乡村人口'], marker='s', label='乡村人口', linewidth=2)

plt.xlabel('年份')
plt.ylabel('人口数量（万人）')
plt.title('城镇和乡村人口变化趋势')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('城乡人口变化趋势图.png', dpi=300, bbox_inches='tight')
plt.show()

# 4. 绘制城镇人口与年末总人口关系散点图
plt.figure(figsize=(8, 6))
plt.scatter(population['年末总人口'], population['城镇人口'], c='red', alpha=0.7, s=60)

plt.xlabel('年末总人口（万人）')
plt.ylabel('城镇人口（万人）')
plt.title('城镇人口与年末总人口关系')
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('城镇人口与总人口关系散点图.png', dpi=300, bbox_inches='tight')
plt.show()

print("所有任务完成！") 